package com.wildfire.conf;

import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
import org.apache.shiro.web.session.mgt.DefaultWebSessionManager;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.LinkedHashMap;
import java.util.Map;
/*
 * 常用三种过滤器
 * anno 匿名过滤器
 * authc 认证过滤器 需要登陆
 * roles 角色过滤器
 */
@Configuration
public class ShiroConfig {
    @Bean
    MyRealm myRealm(){
        return new MyRealm();
    }
	
    @Bean
    DefaultWebSecurityManager securityManager(){
        DefaultWebSecurityManager manager = new DefaultWebSecurityManager();
        MyRealm myRealm = myRealm();
        //将域添加到我们的安全管理器中
        manager.setRealm(myRealm);
        //设置Session管理器，配置shiro中Session的持续时间
        manager.setSessionManager(getDefaultWebSessionManager());
        return manager;
    }

    
    @Bean
    public DefaultWebSessionManager getDefaultWebSessionManager() {
        DefaultWebSessionManager defaultWebSessionManager = new DefaultWebSessionManager();
        defaultWebSessionManager.setGlobalSessionTimeout(1000 * 60 * 60);// 会话过期时间，单位：毫秒--->一分钟,用于测试
        defaultWebSessionManager.setSessionValidationSchedulerEnabled(true);
        defaultWebSessionManager.setSessionIdCookieEnabled(true);
        return defaultWebSessionManager;
    }



	//设置访问拦截器
    @Bean
    ShiroFilterFactoryBean shiroFilterFactoryBean(){
        ShiroFilterFactoryBean bean = new ShiroFilterFactoryBean();
        //传入安全管理器
        bean.setSecurityManager(securityManager());
        //传入未登录用户访问登陆用户的权限所跳转的页面
        bean.setLoginUrl("/system/401");
        //设置成功后返回页面
        //bean.setSuccessUrl("/index");
        //访问未授权网页所跳转的页面
        bean.setUnauthorizedUrl("/system/403");
        Map<String, String> map = new LinkedHashMap<>();
        //允许需要设置login为anon 否则登陆成功后无法成功跳转。
        map.put("/system/userLogin", "anon");
        map.put("/system/userLogout", "anon");
        map.put("/system/401", "anon");
        map.put("/system/403", "anon");
        map.put("/user/getUserPage", "roles[admin]");
        //设置所有的请求未登录不允许进入。
        map.put("/**", "authc");
        bean.setFilterChainDefinitionMap(map);
        //Map<String, Filter> filters = bean.getFilters();
        //filters.put("authc", new CustomFormAuthenticationFilter());
        return bean;
    }
}
